package com.carbeauty.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

/**
 * Spring Security 安全配置
 * 
 * 安全配置说明:
 * - 配置URL访问权限
 * - 配置登录登出
 * - 配置密码加密
 * - 配置角色权限
 * 
 * 角色权限控制:
 * - ADMIN: 系统管理员，拥有所有权限
 * - MANAGER: 店长，拥有门店管理权限  
 * - EMPLOYEE: 员工，拥有基础业务权限
 * - CUSTOMER: 客户，只能访问个人相关功能
 * 
 * @author CarBeauty Team
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    
    /**
     * 密码加密器
     * 使用BCrypt加密算法，安全性高
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
    /**
     * 安全过滤器链配置
     */
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // 禁用CSRF保护（开发阶段，生产环境建议启用）
            .csrf(csrf -> csrf.disable())
            
            // 配置URL访问权限
            .authorizeHttpRequests(authz -> authz
                // 公开访问的URL
                .requestMatchers("/", "/index", "/home", "/about", "/modules").permitAll()
                .requestMatchers("/css/**", "/js/**", "/images/**", "/favicon.ico").permitAll()
                .requestMatchers("/login", "/register", "/forgot-password").permitAll()
                .requestMatchers("/api/public/**").permitAll()
                
                // 管理员专用功能
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .requestMatchers("/system/**").hasRole("ADMIN")
                .requestMatchers("/users/**").hasRole("ADMIN")
                
                // 管理层功能（管理员和店长）
                .requestMatchers("/manage/**").hasAnyRole("ADMIN", "MANAGER")
                .requestMatchers("/reports/**").hasAnyRole("ADMIN", "MANAGER")
                .requestMatchers("/statistics/**").hasAnyRole("ADMIN", "MANAGER")
                
                // 员工功能（管理员、店长、员工）
                .requestMatchers("/customers/**").hasAnyRole("ADMIN", "MANAGER", "EMPLOYEE")
                .requestMatchers("/services/**").hasAnyRole("ADMIN", "MANAGER", "EMPLOYEE")
                .requestMatchers("/orders/**").hasAnyRole("ADMIN", "MANAGER", "EMPLOYEE")
                .requestMatchers("/materials/**").hasAnyRole("ADMIN", "MANAGER", "EMPLOYEE")
                .requestMatchers("/inventory/**").hasAnyRole("ADMIN", "MANAGER", "EMPLOYEE")
                
                // 客户功能
                .requestMatchers("/customer/profile/**").hasRole("CUSTOMER")
                .requestMatchers("/customer/orders/**").hasRole("CUSTOMER")
                .requestMatchers("/customer/recharge/**").hasRole("CUSTOMER")
                
                // API接口权限
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                .requestMatchers("/api/manage/**").hasAnyRole("ADMIN", "MANAGER")
                .requestMatchers("/api/employee/**").hasAnyRole("ADMIN", "MANAGER", "EMPLOYEE")
                .requestMatchers("/api/customer/**").hasRole("CUSTOMER")
                
                // 其他所有请求需要认证
                .anyRequest().authenticated()
            )
            
            // 配置登录
            .formLogin(form -> form
                .loginPage("/login")                    // 自定义登录页面
                .loginProcessingUrl("/perform_login")   // 登录处理URL
                .defaultSuccessUrl("/dashboard", true)  // 登录成功后跳转
                .failureUrl("/login?error=true")        // 登录失败跳转
                .usernameParameter("username")          // 用户名参数名
                .passwordParameter("password")          // 密码参数名
                .permitAll()
            )
            
            // 配置登出
            .logout(logout -> logout
                .logoutUrl("/logout")                   // 登出URL
                .logoutSuccessUrl("/login?logout=true") // 登出成功跳转
                .invalidateHttpSession(true)           // 清除session
                .deleteCookies("JSESSIONID")           // 删除cookies
                .permitAll()
            )
            
            // 配置记住我功能
            .rememberMe(remember -> remember
                .key("carBeautyRememberMe")             // 记住我密钥
                .tokenValiditySeconds(7 * 24 * 3600)   // 7天有效期
            )
            
            // 配置会话管理
            .sessionManagement(session -> session
                .maximumSessions(1)                     // 最大并发会话数
                .maxSessionsPreventsLogin(false)        // 不阻止新登录
                .expiredUrl("/login?expired=true")      // 会话过期跳转
            )
            
            // 配置异常处理
            .exceptionHandling(ex -> ex
                .accessDeniedPage("/error/403")         // 访问拒绝页面
            );
            
        return http.build();
    }
    
    /**
     * 生成加密密码的工具方法
     * 用于初始化默认用户密码
     */
    public static void main(String[] args) {
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        
        // 生成默认管理员密码
        String adminPassword = encoder.encode("admin123");
        System.out.println("管理员密码(admin123)加密后: " + adminPassword);
        
        // 生成测试用户密码
        String userPassword = encoder.encode("user123");
        System.out.println("用户密码(user123)加密后: " + userPassword);
        
        // 生成客户密码
        String customerPassword = encoder.encode("customer123");
        System.out.println("客户密码(customer123)加密后: " + customerPassword);
    }
}
